/*
 * @(#)InterfaceClientReport.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.gui;

import de.hdm.gruppenkalender.team04.GruppenkalenderVerwaltung;
import de.hdm.gruppenkalender.team04.data.Alarm;
import de.hdm.gruppenkalender.team04.data.Kalender;
import de.hdm.gruppenkalender.team04.data.Kategorie;
import de.hdm.gruppenkalender.team04.data.Person;
import de.hdm.gruppenkalender.team04.data.Termin;
import de.hdm.gruppenkalender.team04.report.BerichtGenerator;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.sql.Timestamp;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 * In dieser Klasse werden alle Client-Requests als Methoden umgesetzt.
 * <p>
 * In Anlehung an:
 * de.hdm.rathke.bankInterface.InterfaceClient.java
 * 
 * @author Prof. Dr. Christian Rathke
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 * 
 */
public class InterfaceClientReport {

    /**
     * Die Klasse InterfaceClientReport wird nur einmal instantiiert.
     * Man spricht hierbei von einem sogenannten <b>Singleton</b>.
     * <p>
     * Diese Variable ist durch den Bezeichner <code>static</code> nur einmal für
     * sämtliche eventuellen Instanzen dieser Klasse vorhanden. Sie speichert die
     * einzige Instanz dieser Klasse.
     *
     * @see #interfaceClientReport()
     */
    private static InterfaceClientReport icr;
    private GruppenkalenderVerwaltung verwaltung = null;
    private BerichtGenerator berichtGenerator;
    private static String ip;
    // Standard-IP, die gesetzt wird, wenn keine Eingabe erfolgt.
    private final static String LOCALHOST_IP = "127.0.0.1";
    // Standard-Port, der gesetzt wird, wenn keine Eingabe erfolgt.
    private final static String PORT = "1099";

    /**
     * Geschützter Konstruktor - verhindert die Möglichkeit, mit new neue
     * Instanzen dieser Klasse zu erzeugen.
     */
    protected InterfaceClientReport() {
    }

    /**
     * Diese statische Methode kann aufgrufen werden durch
     * <code>InterfaceClientReport.interfaceClientReport()</code>. Sie stellt die
     * Singleton-Eigenschaft sicher, indem Sie dafür sorgt, daß nur eine einzige
     * Instanz von <code>InterfaceClient</code> existiert.
     *
     * @return {@link InterfaceClientReport}-Objekt.
     * @see #icr
     */
    public static InterfaceClientReport interfaceClientReport() {
        if (icr == null) {

            icr = new InterfaceClientReport();

            ip = JOptionPane.showInputDialog(null,
                    "Geben Sie die Server-IP an: (leer lassen für localhost!)",
                    "Anmeldung am System", JOptionPane.QUESTION_MESSAGE);
            if (ip == null) {
                // Nutzer hat Dialog abgebrochen.
                System.exit(0);
            } else if (ip.equals("")) {
                // Nutzer hat keine Eingabe getätigt, deshalb localhost.
                ip = LOCALHOST_IP + ":" + PORT;
                System.out.println("Suche Server mit IP: " + ip);
            } else if (ip.indexOf(":") == -1) {
                ip += (":" + PORT);
                System.out.println("Suche Server mit IP: " + ip);
            }
        }

        return icr;
    }

    /**
     * Stellt Verbindung zum RMI-Server her.
     */
    private void stelleServerVerbindungHer() {
        try {

            verwaltung = (GruppenkalenderVerwaltung) Naming.lookup(
                    "rmi://" + ip + "/GruppenkalenderVerwaltung");

            berichtGenerator = verwaltung.getBerichtGenerator();

            System.out.println("Server-Verbindung hergestellt...");

        } catch (NotBoundException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);

        } catch (MalformedURLException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);

        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);

        }
    }

    /**
     * Ermittelt alle Personen.
     *
     * @return  Vector<Person>  mit allen Personen.
     */
    public Vector<Person> ermittleAllePersonen() {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        Vector<Person> personen = new Vector<Person>();

        try {
            personen = verwaltung.ermittleAllePersonen();
        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);
        }

        return personen;
    }

    /**
     * Ermittelt alle Alarme.
     *
     * @return  Vector<Alarm>   mit allen Alarmen.
     */
    public Vector<Alarm> ermittleAlleAlarme() {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        Vector<Alarm> alarme = new Vector<Alarm>();

        try {
            alarme = verwaltung.ermittleAlleAlarme();
        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);
        }

        return alarme;
    }

    /**
     * Ermittelt alle Alarme von übergebener Person.
     *
     * @param   person
     * @return  Vector<Alarm>   mit allen Alarmen von übergebener Person.
     */
    public Vector<Alarm> ermittleAlleAlarmeVon(Person person) {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        Vector<Alarm> alarme = new Vector<Alarm>();

        try {
            alarme = verwaltung.ermittleAlleAlarmeVonPerson(person);
        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);
        }

        return alarme;
    }

    /**
     * Ermittelt alle Termine.
     *
     * @return  Vector<Termin>  mit allen Terminen.
     */
    public Vector<Termin> ermittleAlleTermine() {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        Vector<Termin> termine = new Vector<Termin>();

        try {
            termine = verwaltung.ermittleAlleTermine();

        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);
        }

        return termine;
    }

    /**
     * Ermittelt alle Termine von übergebener Person.
     *
     * @param   person
     * @return  Vector<Person>  mit allen Terminen von übergebener Person.
     */
    public Vector<Termin> ermittleAlleTermineVon(Person person) {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        Vector<Termin> termine = new Vector<Termin>();

        try {
            termine = verwaltung.ermittleAlleTermineVonPerson(person);
        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);
        }

        return termine;
    }

    /**
     * Ermittelt alle Kategorien.
     *
     * @return  Vector<Kategorie>   mit allen Kategorien.
     */
    public Vector<Kategorie> ermittleAlleKategorien() {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        Vector<Kategorie> kategorien = new Vector<Kategorie>();

        try {
            kategorien = verwaltung.ermittleAlleKategorien();
        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);
        }

        return kategorien;
    }

    /**
     * Ermittelt alle Kalender einer übergebenen Person.
     *
     * @param   person
     * @return  Vector<Kalender>    mit allen Kalendern von übergebener Person.
     */
    public Vector<Kalender> ermittleAlleKalenderVon(Person person) {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        Vector<Kalender> kalenders = new Vector<Kalender>();

        try {
            kalenders = verwaltung.ermittleAlleKalenderVonPerson(person);

        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).log(
                    Level.SEVERE,
                    null, ex);
        }

        return kalenders;
    }

    /**
     * Ermittelt alle Kalender.
     *
     * @return  Vector<Kalender>    mit allen Kalendern.
     */
    public Vector<Kalender> ermittleAlleKalender() {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        Vector<Kalender> kalender = new Vector<Kalender>();
        try {
            kalender = verwaltung.ermitlleAlleKalender();
        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).
                    log(Level.SEVERE, null, ex);
        }

        return kalender;
    }

    /**
     * Erstellt einen HTML-Report anhand der übergebenen Parameter.
     *
     * @param   person
     * @param   kalender
     * @param   kategorie
     * @param   von
     * @param   bis
     *
     * @return  String      der den HTML-Report beinhaltet.
     */
    public String erstelleReport(Person person, Kalender kalender,
            Kategorie kategorie, Timestamp von, Timestamp bis) {
        if (verwaltung == null) {
            this.stelleServerVerbindungHer();
        }

        try {
            return berichtGenerator.erstelleReport(person, kalender, kategorie,
                    von, bis);

        } catch (RemoteException ex) {
            Logger.getLogger(InterfaceClientReport.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        return null;
    }
}
